package ru.xeden.core.exception;

import java.util.Locale;


/**
 * Нелакализованное сообщение об ошибке, аггрегирует необходимую информацию для формирования
 * "внятного" сообщения об ошибке
 */
public class UnlocalisedMessage
{
    /**
     * Пустой набор аргументов
     */
    private static final Object [] EMPTY_ARGS = new Object[0];
    /**
     * ID ошибки (обычно это строка в ресурсном файле)
     */
    private String m_strErrorId;
    /**
     * Аргументы сообщения
     */
    private Object [] m_aArgs = null;

    private UnlocalisedMessage()
    {
    }

    /**
     * Фабричный метод создает экземпляр нелакализованного сообщения, без аргументов
     *
     * @param strErrorId ID ошибки (обычно это строка в ресурсном файле)
     * @return экземпляр объекта
     */
    public static UnlocalisedMessage createUnlocaliseMessage(String strErrorId)
    {
        return createUnlocaliseMessage(strErrorId, EMPTY_ARGS);
    }

    /**
     * Фабричный метод создает экземпляр нелакализованного сообщения, с одним аргументом
     *
     * @param strErrorId ID ошибки (обычно это строка в ресурсном файле)
     * @param arg        аргумент, который проставляется в шаблон сообщения
     * @return экземпляр объекта
     */
    public static UnlocalisedMessage createUnlocaliseMessage(String strErrorId, Object arg)
    {
        return createUnlocaliseMessage(strErrorId, new Object[]
        {
            arg
        });
    }

    /**
     * Фабричный метод создает экземпляр нелакализованного сообщения, c несколькими аргументами
     *
     * @param strErrorId ID ошибки (обычно это строка в ресурсном файле)
     * @param aArgs      набор аргументов
     * @return экземпляр объекта
     */
    public static UnlocalisedMessage createUnlocaliseMessage(String strErrorId, Object [] aArgs)
    {
        UnlocalisedMessage message = new UnlocalisedMessage();
        message.m_strErrorId = strErrorId;
        message.m_aArgs = aArgs;
        return message;
    }

    /**
     * @return ID ошибки (обычно это строка в ресурсном файле)
     */
    public String getMessageId()
    {
        return m_strErrorId;
    }

    /**
     * @return набор аргументов аргументов сообщения об ошибке, может быть пустым массивом но не null
     */
    public Object [] getArguments()
    {
        return m_aArgs == null ? EMPTY_ARGS : m_aArgs;
    }
}
